#pragma once

#include <string>
#include <memory>

namespace viml {

// 前向声明
class Program;
class Bytecode;

/**
 * Pass统计信息
 */
struct PassStatistics {
    std::string pass_name;              // Pass名称
    size_t run_count = 0;               // 运行次数
    size_t transformations = 0;         // 应用的转换数量
    double time_spent_ms = 0.0;         // 耗时(毫秒)
    bool changed = false;               // 是否发生了修改
    
    PassStatistics() = default;
    explicit PassStatistics(const std::string& name) : pass_name(name) {}
};

/**
 * 优化Pass抽象基类
 * 
 * 所有优化Pass必须继承此类并实现run方法
 */
class OptimizationPass {
public:
    virtual ~OptimizationPass() = default;
    
    /**
     * 执行优化Pass
     * @param program 待优化的程序AST
     * @return 是否发生了修改
     */
    virtual bool run(Program* program) = 0;
    
    /**
     * 获取Pass名称
     * @return Pass的唯一标识名称
     */
    virtual std::string get_name() const = 0;
    
    /**
     * 获取Pass描述
     * @return Pass的功能描述
     */
    virtual std::string get_description() const {
        return "Optimization pass";
    }
    
    /**
     * 检查Pass是否启用
     * @return Pass是否启用
     */
    virtual bool is_enabled() const {
        return enabled_;
    }
    
    /**
     * 设置Pass启用状态
     * @param enabled 是否启用
     */
    virtual void set_enabled(bool enabled) {
        enabled_ = enabled;
    }
    
    /**
     * 获取Pass统计信息
     * @return 统计信息
     */
    virtual PassStatistics get_statistics() const {
        return statistics_;
    }
    
    /**
     * 重置Pass状态
     */
    virtual void reset() {
        statistics_ = PassStatistics(get_name());
    }
    
protected:
    bool enabled_ = true;                   // Pass是否启用
    PassStatistics statistics_;             // 统计信息
};

/**
 * 字节码优化Pass抽象基类
 * 
 * 用于在字节码级别进行优化的Pass
 */
class BytecodePass {
public:
    virtual ~BytecodePass() = default;
    
    /**
     * 执行字节码优化
     * @param bytecode 待优化的字节码
     * @return 是否发生了修改
     */
    virtual bool run(Bytecode* bytecode) = 0;
    
    /**
     * 获取Pass名称
     * @return Pass的唯一标识名称
     */
    virtual std::string get_name() const = 0;
    
    /**
     * 获取Pass描述
     * @return Pass的功能描述
     */
    virtual std::string get_description() const {
        return "Bytecode optimization pass";
    }
    
    /**
     * 检查Pass是否启用
     * @return Pass是否启用
     */
    virtual bool is_enabled() const {
        return enabled_;
    }
    
    /**
     * 设置Pass启用状态
     * @param enabled 是否启用
     */
    virtual void set_enabled(bool enabled) {
        enabled_ = enabled;
    }
    
    /**
     * 获取Pass统计信息
     * @return 统计信息
     */
    virtual PassStatistics get_statistics() const {
        return statistics_;
    }
    
    /**
     * 重置Pass状态
     */
    virtual void reset() {
        statistics_ = PassStatistics(get_name());
    }
    
protected:
    bool enabled_ = true;                   // Pass是否启用
    PassStatistics statistics_;             // 统计信息
};

} // namespace viml
